package common

import "fmt"

// ProtocolType 协议类型枚举
type ProtocolType uint8

const (
	ProtocolTypeText     ProtocolType = 0x01 // 文本协议
	ProtocolTypeBarcode  ProtocolType = 0x04 // 条码协议
	ProtocolTypeImage    ProtocolType = 0x02 // 图片协议（预留）
	ProtocolTypeTable    ProtocolType = 0x06 // 表格协议（预留）
	ProtocolTypeDate     ProtocolType = 0x03 // 日期协议
	ProtocolTypeWorkcode ProtocolType = 0x20 // 命令包协议
)

// String 返回协议类型的字符串表示
func (pt ProtocolType) String() string {
	switch pt {
	case ProtocolTypeText:
		return "文本协议"
	case ProtocolTypeBarcode:
		return "条码协议"
	case ProtocolTypeImage:
		return "图片协议"
	case ProtocolTypeTable:
		return "表格协议"
	case ProtocolTypeDate:
		return "日期协议"
	case ProtocolTypeWorkcode:
		return "命令包协议"
	default:
		return fmt.Sprintf("未知协议(%d)", uint8(pt))
	}
}

// 通用样式枚举
type Style uint32

const (
	StyleSolid     Style = 0x00 // 实体
	StyleDotMatrix Style = 0x01 // 圆点阵
	StyleSquare    Style = 0x02 // 方点阵
	StyleStrike    Style = 0x03 // 删除体
)

// String 返回样式的字符串表示
func (s Style) String() string {
	switch s {
	case StyleSolid:
		return "实体"
	case StyleDotMatrix:
		return "圆点阵"
	case StyleSquare:
		return "方点阵"
	case StyleStrike:
		return "删除体"
	default:
		return fmt.Sprintf("未知样式(%d)", uint32(s))
	}
}

// 通用位置结构
type Position struct {
	X uint32 // 横坐标，范围0-999999
	Y uint32 // 纵坐标，范围0-999999
}

// String 返回位置的字符串表示
func (p Position) String() string {
	return fmt.Sprintf("(%d,%d)", p.X, p.Y)
}

// 通用尺寸结构
type Size struct {
	Width  uint32 // 宽度
	Height uint32 // 高度
}

// String 返回尺寸的字符串表示
func (s Size) String() string {
	return fmt.Sprintf("%dx%d", s.Width, s.Height)
}

// 协议头部常量
const (
	StartByte1 = 0x5A // 起始位第1字节
	StartByte2 = 0x4B // 起始位第2字节
	StartByte3 = 0x43 // 起始位第3字节
	StartByte4 = 0x54 // 起始位第4字节
	
	StopByte1 = 0x0D // 停止位第1字节
	StopByte2 = 0x0A // 停止位第2字节
)

// 验证范围的辅助函数
func ValidateRange(value, min, max uint32, fieldName string) error {
	if value < min || value > max {
		return fmt.Errorf("%s超出范围 [%d-%d]: %d", fieldName, min, max, value)
	}
	return nil
}

// 验证文本长度的辅助函数
func ValidateTextLength(text []byte, min, max int, fieldName string) error {
	length := len(text)
	if length < min || length > max {
		return fmt.Errorf("%s长度超出范围 [%d-%d]: %d", fieldName, min, max, length)
	}
	return nil
}